package com.jenkins.test.proxy.example;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * @version V0.0.1
 * @ClassName: {@link ProxyDaoRegister}
 * @Description: ProxyDaoRegister
 * @author: Lanzhou
 * @date: 2022/1/22 22:54
 * @Copyright:2019 All rights reserved.
 * 注意：本内容仅限于本人开发与维护，禁止外泄以及用于其他的商业目
 */
//@Component
public class ProxyDaoRegister implements ApplicationContextAware, BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }

    /**
     * 我们这里是可以直接代理BaseDao的接口的哦, 注意了哦
     *
     * @param registry 注册信息
     * @throws BeansException
     */
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        // 需要被代理的接口
        Class<?> cls = BaseDao.class;
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(cls);
        GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
        // 这里是相当于调用BaseDaoProxyFactory中的setInterfaceClass()方法，详细的可以了解spring相关资料
        // 可以添加我们的普通定义的属性合集, 如果里面有注入某些实例(不能是莫些Bean), 可以在这里添加进去, 相当于调用工厂的setXxxx()方法
        definition.getPropertyValues().add("interfaceClass", definition.getBeanClassName());
        // FactoryBean是一种特殊的Bean，这里的BeanClass是生成Bean实例的工厂，不是Bean本身。其返回的是该工厂Bean的getObject方法所返回的对象。
        definition.setBeanClass(BaseDaoProxyFactory.class);
        definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
        // 注册dao
        registry.registerBeanDefinition("baseDao", definition);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

    }
}

